package reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class test09 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //获得user类的Class对象
        Class aClass = Class.forName("reflection.user");
        //使用Class对象创建一个user对象。本质上是默认使用无参构造器创建对象
        user user = (user) aClass.newInstance();
        System.out.println(user);
        //通过Class对象获取user类的构造器，使用获取的构造器创造对象
        Constructor constructor = aClass.getDeclaredConstructor(String.class,int.class,int.class);
        user user2 = (user)constructor.newInstance("张三",18,12);
        System.out.println(user2);
        //通过反射，Class对象获得方法并调用方法
        Method method =aClass.getDeclaredMethod("setName", String.class);
        //invoke(执行方法的对象，输入的参数)
        method.invoke(user2,"张山");
        System.out.println(user2);
        //通过反射修改属性.
        Field id = aClass.getDeclaredField("id");
        //public的属性可以直接修改，但是private的不能直接修改，需要关闭安全检测
        //关闭安全检查
        id.setAccessible(true);
        id.set(user2,1);
        System.out.println(user2);
    }
}
